﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using CPTECH.Repository;
using CPTECH.Business;

namespace CPTECH.Presentation
{
    public partial class frm_departamento : frm_default
    {
        int fluxo = 0;
        frm_alterarItem alterar = new frm_alterarItem();
        frm_validarInv validar = new frm_validarInv();

        public frm_departamento(frm_alterarItem sendedAlterar, frm_validarInv sendedValidar, int fluxoReceiv)
        {
            InitializeComponent();
            
            fluxo = fluxoReceiv;
            alterar = sendedAlterar;
            validar = sendedValidar;
        }
        
        //volta para o form anterior.
        private void menuItem1_Click(object sender, EventArgs e)
        {
            this.closeForm();//usa método herdado.
        }

        //seta o valor seleciona nos textbox.
        private void lst_departamento_SelectedIndexChanged(object sender, EventArgs e)
        {
            string[] deptoSeparada = lst_departamento.SelectedItem.ToString().Split('=');
            txt_codDepartamento.Text = "";
            txt_codDepartamento.Text = deptoSeparada[0].Trim();
            txt_descDepartamento.Text = "";
            txt_descDepartamento.Text = deptoSeparada[1].Trim();
        }

        //chama método que preenche a listBox
        private void frm_departamento_Load(object sender, EventArgs e)
        {
            showDepto();
        }

        //método que popula a list com os Departamentos.
        private void showDepto()
        {
            lst_departamento.Items.Clear();
            ArrayList resultado = DepartamentoDB.getInstance().selectAllDepartamento();

            for (int i = 0; i < resultado.Count; i++)
            {
                lst_departamento.Items.Add(resultado[i].ToString());
            }
        }

        //checa valores e campos, grava-os e segue para o proximo form(frm_).
        private void checkAndSave()
        {
            //verifica
            if (txt_codDepartamento.Text == "" || txt_descDepartamento.Text == "")
            {
                MessageBox.Show("Selecione um Departamento para continuar", "Aviso");
                lst_departamento.Focus();
            }
            //grava e chama form.
            else
            {
                //Inventário.
                if (fluxo == 0)
                {
                    FisicoBO.getInstance().codDepto = txt_codDepartamento.Text;

                    //chama form seguinte.
                    //checa pra ver se  o formulário Centro de Custo foi marcado para ser chamado.
                    if (FisicoBO.getInstance().ckCcusto)
                    {
                        frm_cCusto Ccusto = new frm_cCusto(null, null, 0);//craia instancia do novo form.
                        Ccusto.showForm(this);//exibe o form novo.
                    }

                    //checa pra ver se  o formulário Planta foi marcado para ser chamado.
                    else if (FisicoBO.getInstance().ckPlanta)
                    {
                        frm_planta planta = new frm_planta(null, null, 0);//craia instancia do novo form.
                        planta.showForm(this);//exibe o form novo.
                    }

                    //chama o formulário de Fisico.
                    else
                    {
                        frm_fisico fisico = new frm_fisico();//cria instancia do novo form.
                        fisico.showForm(this);//exibi form novo.
                    }
                }
                //re - inventário.
                else if (fluxo == 1)
                {
                    validar.sendedValues("depto", txt_codDepartamento.Text.Trim());
                    this.closeForm();
                }
                //alteração
                else
                {
                    alterar.sendedValues("depto", txt_codDepartamento.Text.Trim());
                    this.closeForm();
                }
            }
        }

        //verifica campos.
        private bool verificaCampos()
        {
            bool campos = false;

            if (txt_codDepartamento.Text == "")
            {
                MessageBox.Show("Insira um código de Departamento para continuar!", "Departamento");
                txt_codDepartamento.Focus();
            }

            else if (txt_descDepartamento.Text == "")
            {
                MessageBox.Show("Insira uma descrição de Departamento para continuar!", "Departamento");
                txt_descDepartamento.Focus();
            }
            else
            {
                campos = true;
            }

            return campos;
        }

        //muda botão de add para salvar e habilita os campos para inserção.
        private void activeInsert()
        {
            lst_departamento.Enabled = false;
            bt_cancelar.Visible = true;
            txt_codDepartamento.Enabled = true;
            txt_codDepartamento.Text = "";
            txt_descDepartamento.Enabled = true;
            txt_descDepartamento.Text = "";
            txt_codDepartamento.Focus();
            bt_add.Text = "Salvar";
        }

        //muda opção de salvar para add e desabilita os campos pra inserção.
        private void desactiveInsert()
        {
            lst_departamento.Enabled = true;
            bt_cancelar.Visible = false;
            txt_codDepartamento.Enabled = false;
            txt_descDepartamento.Enabled = false;
            lst_departamento.Focus();
            bt_add.Text = "Add";
        }

        //chama o método que cancela a inserção de departamento.
        private void bt_cancelar_Click(object sender, EventArgs e)
        {
            desactiveInsert();
        }

        //chama o método que salva os dados e chama form seguinte.
        private void menuItem2_Click(object sender, EventArgs e)
        {
            checkAndSave();
        }

        //checa texto (habilita para o insert *Add || ou salva o mesmo *Salvar)
        private void bt_add_Click(object sender, EventArgs e)
        {
            if (bt_add.Text == "Add")
            {
                activeInsert();
            }
            else
            {
                string os = FisicoBO.getInstance().os;
                Int64 codDepto = Int64.Parse(txt_codDepartamento.Text);
                string descDepto = txt_descDepartamento.Text.ToUpper();
                string data = DateTime.Now.ToString("yyyy-MM-dd");

                if (DepartamentoDB.getInstance().checkCodDepartamento(codDepto))
                {
                    MessageBox.Show("Este código de Departamento já existe, favor informar um novo!", "Departamento");
                    txt_codDepartamento.Text = "";
                    txt_codDepartamento.Focus();
                }
                else if (verificaCampos())
                {
                    bool resposta = DepartamentoDB.getInstance().insertNewDepto(os, codDepto, descDepto, data, 1);

                    if (resposta == true)
                    {
                        desactiveInsert();
                        MessageBox.Show("Departamento inserido com sucesso!", "Departamento");
                        txt_codDepartamento.Text = codDepto.ToString();
                        txt_descDepartamento.Text = descDepto;
                        showDepto();
                    }

                    else if (resposta == false)
                    {
                        MessageBox.Show("Não foi possível adicionar o Departamento, cheque os valores informados!", "Departamento");
                        txt_codDepartamento.Focus();
                    }
                }
            }
        }

        //permite apenas inserção de números no campo.
        private void txt_codDepartamento_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
                MessageBox.Show("Somente números são permitidos neste campo!", "Aviso");
                txt_codDepartamento.Text = "";
                txt_codDepartamento.Focus();
            }

        }
    }
}